/*
* This file is a part of the open-eBackup project.
* This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
* If a copy of the MPL was not distributed with this file, You can obtain one at
* http://mozilla.org/MPL/2.0/.
*
* Copyright (c) [2024] Huawei Technologies Co.,Ltd.
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
*/
#ifndef JSON_TRANS_TUIL_H
#define JSON_TRANS_TUIL_H

#include "define/Types.h"
#include "common/JsonHelper.h"
#include "thrift_interface/ApplicationProtectBaseDataType_types.h"
#include "thrift_interface/ApplicationProtectPlugin_types.h"
#include "thrift_interface/ApplicationProtectFramework_types.h"

static void StructToJson(const ApplicationPlugin &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.name, jsonValue["name"]);
    Module::JsonHelper::TypeToJsonValue(st.endPoint, jsonValue["endPoint"]);
    Module::JsonHelper::TypeToJsonValue(st.port, jsonValue["port"]);
    Module::JsonHelper::TypeToJsonValue(st.processId, jsonValue["processId"]);
}

static void StructToJson(const Authentication &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(int(st.authType), jsonValue["authType"]);
    Module::JsonHelper::TypeToJsonValue(st.authkey, jsonValue["authKey"]);
    if (!st.extendInfo.empty())
        Module::JsonHelper::JsonStringToJsonValue(st.extendInfo, jsonValue["extendInfo"]);
}

static void StructToJson(const ApplicationResource &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.type, jsonValue["type"]);
    Module::JsonHelper::TypeToJsonValue(st.subType, jsonValue["subType"]);
    Module::JsonHelper::TypeToJsonValue(st.id, jsonValue["uuid"]);
    Module::JsonHelper::TypeToJsonValue(st.name, jsonValue["name"]);
    Module::JsonHelper::TypeToJsonValue(st.parentId, jsonValue["parentUuid"]);
    Module::JsonHelper::TypeToJsonValue(st.parentName, jsonValue["parentName"]);
    if (!st.extendInfo.empty())
        Module::JsonHelper::JsonStringToJsonValue(st.extendInfo, jsonValue["extendInfo"]);
}

static void StructToJson(const Application &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.type, jsonValue["type"]);
    Module::JsonHelper::TypeToJsonValue(st.subType, jsonValue["subType"]);
    Module::JsonHelper::TypeToJsonValue(st.id, jsonValue["uuid"]);
    Module::JsonHelper::TypeToJsonValue(st.name, jsonValue["name"]);
    Module::JsonHelper::TypeToJsonValue(st.parentId, jsonValue["parentUuid"]);
    Module::JsonHelper::TypeToJsonValue(st.parentName, jsonValue["parentName"]);
    StructToJson(st.auth, jsonValue["auth"]);
    if (!st.extendInfo.empty())
        Module::JsonHelper::JsonStringToJsonValue(st.extendInfo, jsonValue["extendInfo"]);
}

static void StructToJson(const ApplicationEnvironment &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.id, jsonValue["uuid"]);
    Module::JsonHelper::TypeToJsonValue(st.name, jsonValue["name"]);
    Module::JsonHelper::TypeToJsonValue(st.type, jsonValue["type"]);
    Module::JsonHelper::TypeToJsonValue(st.subType, jsonValue["subType"]);
    Module::JsonHelper::TypeToJsonValue(st.endpoint, jsonValue["endpoint"]);
    Module::JsonHelper::TypeToJsonValue(st.port, jsonValue["port"]);
    StructToJson(st.auth, jsonValue["auth"]);
    if (!st.extendInfo.empty())
        Module::JsonHelper::JsonStringToJsonValue(st.extendInfo, jsonValue["extendInfo"]);
}

static void StructToJson(const SubJob &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.jobId, jsonValue["taskId"]);
    Module::JsonHelper::TypeToJsonValue(int(st.jobType), jsonValue["taskType"]);
    Module::JsonHelper::TypeToJsonValue(st.jobName, jsonValue["taskName"]);
    Module::JsonHelper::TypeToJsonValue(st.jobPriority, jsonValue["taskPriority"]);
    Module::JsonHelper::TypeToJsonValue(int(st.policy), jsonValue["policy"]);
    Module::JsonHelper::TypeToJsonValue(st.ignoreFailed, jsonValue["ignoreFailed"]);
    jsonValue["taskParams"] = st.jobInfo;
}

static void StructToJson(const std::vector<AppProtect::SubJob> &jobs, Json::Value &jsonValue)
{
    for (const auto &job : jobs) {
        Json::Value value;
        StructToJson(job, value);
        jsonValue.append(value);
    }
}

static void StructToJson(const HostAddress &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.ip, jsonValue["ip"]);
    Module::JsonHelper::TypeToJsonValue(st.port, jsonValue["port"]);
}

static void StructToJson(const StorageRepository &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(int(st.repositoryType), jsonValue["type"]);
    for (auto item : st.path) {
        jsonValue["path"].append(item);
    }
    Module::JsonHelper::TypeToJsonValue(st.isLocal, jsonValue["isLocal"]);
    Module::JsonHelper::TypeToJsonValue(int(st.protocol), jsonValue["protocol"]);
    StructToJson(st.auth, jsonValue["auth"]);
    StructToJson(st.endpoint, jsonValue["endpoint"]);
    for (std::vector<HostAddress>::const_iterator it = st.remoteHost.begin(); it != st.remoteHost.end(); ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["remoteHost"].append(temp);
    }
    Module::JsonHelper::TypeToJsonValue(st.remotePath, jsonValue["remotePath"]);
    Module::JsonHelper::TypeToJsonValue(st.remoteName, jsonValue["remoteName"]);
    if (!st.extendInfo.empty())
        Module::JsonHelper::JsonStringToJsonValue(st.extendInfo, jsonValue["extendInfo"]);
}

static void StructToJson(const Snapshot &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.id, jsonValue["id"]);
    Module::JsonHelper::TypeToJsonValue(st.parentName, jsonValue["parentName"]);
}

static void StructToJson(const Copy &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(int(st.formatType), jsonValue["formatType"]);
    Module::JsonHelper::TypeToJsonValue(int(st.dataType), jsonValue["format"]);
    Module::JsonHelper::TypeToJsonValue(st.id, jsonValue["id"]);
    Module::JsonHelper::TypeToJsonValue(st.name, jsonValue["name"]);
    StructToJson(st.protectEnv, jsonValue["protectEnv"]);
    StructToJson(st.protectObject, jsonValue["protectObject"]);
    for (std::vector<ApplicationResource>::const_iterator it = st.protectSubObjects.begin();
         it != st.protectSubObjects.end();
         ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["protectSubObject"].append(temp);
    }
    for (std::vector<StorageRepository>::const_iterator it = st.repositories.begin(); it != st.repositories.end();
         ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["repositories"].append(temp);
    }

    for (std::vector<Snapshot>::const_iterator it = st.snapshots.begin(); it != st.snapshots.end(); ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["snapshots"].append(temp);
    }
}

static void StructToJson(const AppProtect::Qos &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.bandwidth, jsonValue["bandwidth"]);
    Module::JsonHelper::TypeToJsonValue(st.protectIops, jsonValue["protectIops"]);
    Module::JsonHelper::TypeToJsonValue(st.backupIops, jsonValue["backupIops"]);
}

static void StructToJson(const AppProtect::ResourceFilter &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.filterBy, jsonValue["filterBy"]);
    Module::JsonHelper::TypeToJsonValue(st.type, jsonValue["type"]);
    Module::JsonHelper::TypeToJsonValue(st.rule, jsonValue["rule"]);
    Module::JsonHelper::TypeToJsonValue(st.mode, jsonValue["mode"]);
    Module::JsonHelper::TypeToJsonValue(st.values, jsonValue["values"]);
}

static void StructToJson(const AppProtect::BuildIndexJobParam &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.preCopyId, jsonValue["preCopyId"]);
    Module::JsonHelper::TypeToJsonValue(st.indexPath, jsonValue["indexPath"]);
}

static void StructToJson(const AppProtect::DataLayout &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.encryption, jsonValue["encryption"]);
    Module::JsonHelper::TypeToJsonValue(st.deduption, jsonValue["deduption"]);
    Module::JsonHelper::TypeToJsonValue(st.compression, jsonValue["compression"]);
    Module::JsonHelper::TypeToJsonValue(st.nativeData, jsonValue["nativeData"]);
    if (!st.extendInfo.empty())
        Module::JsonHelper::JsonStringToJsonValue(st.extendInfo, jsonValue["extendInfo"]);
}

static void StructToJson(const AppProtect::JobScripts &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.preScript, jsonValue["preScript"]);
    Module::JsonHelper::TypeToJsonValue(st.postScript, jsonValue["postScript"]);
    Module::JsonHelper::TypeToJsonValue(st.failPostScript, jsonValue["failPostScript"]);
}

static void StructToJson(const AppProtect::BackupJobParam &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(int(st.backupType), jsonValue["backupType"]);
    StructToJson(st.dataLayout, jsonValue["dataLayout"]);
    StructToJson(st.qos, jsonValue["qos"]);
    for (std::vector<AppProtect::ResourceFilter>::const_iterator it = st.filters.begin(); it != st.filters.end();
         ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["filters"].append(temp);
    }
    StructToJson(st.scripts, jsonValue["scripts"]);
    if (!st.advanceParams.empty()) {
        Module::JsonHelper::JsonStringToJsonValue(st.advanceParams, jsonValue["advanceParams"]);
    }
}

static void StructToJson(const AppProtect::BackupJob &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.requestId, jsonValue["requestId"]);
    Module::JsonHelper::TypeToJsonValue(st.jobId, jsonValue["taskId"]);
    StructToJson(st.jobParam, jsonValue["taskParams"]);
    StructToJson(st.protectEnv, jsonValue["envInfo"]);
    StructToJson(st.protectObject, jsonValue["appInfo"]);
    for (std::vector<ApplicationResource>::const_iterator it = st.protectSubObject.begin();
         it != st.protectSubObject.end();
         ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["resourceInfo"].append(temp);
    }
    for (std::vector<StorageRepository>::const_iterator it = st.repositories.begin(); it != st.repositories.end();
         ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["repositories"].append(temp);
    }
    StructToJson(st.copy, jsonValue["copyInfo"]);
    if (!st.extendInfo.empty())
        Module::JsonHelper::JsonStringToJsonValue(st.extendInfo, jsonValue["extendInfo"]);
}

static void StructToJson(const AppProtect::RestoreJobParam &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(int(st.restoreType), jsonValue["restoreType"]);
    for (std::vector<AppProtect::ResourceFilter>::const_iterator it = st.filters.begin(); it != st.filters.end();
         ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["filters"].append(temp);
    }
    StructToJson(st.qos, jsonValue["qos"]);
    StructToJson(st.scripts, jsonValue["scripts"]);
    if (!st.advanceParams.empty())
        Module::JsonHelper::JsonStringToJsonValue(st.advanceParams, jsonValue["advanceParams"]);
}

static void StructToJson(const AppProtect::RestoreJob &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.requestId, jsonValue["requestId"]);
    Module::JsonHelper::TypeToJsonValue(st.jobId, jsonValue["taskId"]);
    StructToJson(st.jobParam, jsonValue["taskParams"]);
    StructToJson(st.targetEnv, jsonValue["envInfo"]);
    StructToJson(st.targetObject, jsonValue["appInfo"]);
    for (std::vector<ApplicationResource>::const_iterator it = st.restoreSubObjects.begin();
         it != st.restoreSubObjects.end();
         ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["resourceInfo"].append(temp);
    }
    for (std::vector<Copy>::const_iterator it = st.copies.begin(); it != st.copies.end(); ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["copies"].append(temp);
    }
    if (!st.extendInfo.empty())
        Module::JsonHelper::JsonStringToJsonValue(st.extendInfo, jsonValue["extendInfo"]);
}

static void StructToJson(const AppProtect::BuildIndexJob &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.requestId, jsonValue["requestId"]);
    Module::JsonHelper::TypeToJsonValue(st.jobId, jsonValue["jobId"]);
    StructToJson(st.jobParam, jsonValue["jobParam"]);
    StructToJson(st.indexEnv, jsonValue["indexEnv"]);
    for (std::vector<Copy>::const_iterator it = st.copies.begin(); it != st.copies.end(); ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["copies"].append(temp);
    }
    StructToJson(st.indexProtectObject, jsonValue["indexProtectObject"]);
    for (std::vector<ApplicationResource>::const_iterator it = st.indexProtectSubObject.begin();
         it != st.indexProtectSubObject.end();
         ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["indexProtectSubObject"].append(temp);
    }
    for (std::vector<StorageRepository>::const_iterator it = st.repositories.begin(); it != st.repositories.end();
         ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["repositories"].append(temp);
    }
    if (!st.extendInfo.empty())
        Module::JsonHelper::JsonStringToJsonValue(st.extendInfo, jsonValue["extendInfo"]);
}

static void StructToJson(const AppProtect::LivemountJobParam &st, Json::Value &jsonValue)
{
    StructToJson(st.scripts, jsonValue["sctipts"]);
    Module::JsonHelper::TypeToJsonValue(st.advanceParams, jsonValue["advanceParams"]);
}

static void StructToJson(const AppProtect::LivemountJob &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.requestId, jsonValue["requestId"]);
    Module::JsonHelper::TypeToJsonValue(st.jobId, jsonValue["jobId"]);
    StructToJson(st.jobParam, jsonValue["jobParam"]);
    StructToJson(st.targetEnv, jsonValue["targetEnv"]);
    StructToJson(st.targetObject, jsonValue["targetObject"]);
    for (std::vector<ApplicationResource>::const_iterator it = st.targetSubObjects.begin();
         it != st.targetSubObjects.end();
         ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["targetSubObjects"].append(temp);
    }
    StructToJson(st.copy, jsonValue["copy"]);
    Module::JsonHelper::TypeToJsonValue(st.extendInfo, jsonValue["extendInfo"]);
}

static void StructToJson(const AppProtect::LogDetail &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(int(st.level), jsonValue["logLevel"]);
    Module::JsonHelper::TypeToJsonValue(st.description, jsonValue["logInfo"]);
    Module::JsonHelper::TypeToJsonValue(st.params, jsonValue["logInfoParam"]);
    Module::JsonHelper::TypeToJsonValue(st.timestamp, jsonValue["logTimestamp"]);
    Module::JsonHelper::TypeToJsonValue(st.errorCode, jsonValue["logDetail"]);
    Module::JsonHelper::TypeToJsonValue(st.errorParams, jsonValue["logDetailParam"]);
    Module::JsonHelper::TypeToJsonValue(st.additionalDesc, jsonValue["logDetailInfo"]);
}

static void StructToJson(const AppProtect::SubJobDetails &st, Json::Value &jsonValue)
{
    Module::JsonHelper::TypeToJsonValue(st.jobId, jsonValue["taskId"]);
    Module::JsonHelper::TypeToJsonValue(st.subJobId, jsonValue["subTaskId"]);
    Module::JsonHelper::TypeToJsonValue(int(st.jobStatus), jsonValue["taskStatus"]);
    Module::JsonHelper::TypeToJsonValue(st.additionalStatus, jsonValue["additionalStatus"]);
    for (std::vector<AppProtect::LogDetail>::const_iterator it = st.logDetail.begin(); it != st.logDetail.end(); ++it) {
        Json::Value temp;
        StructToJson(*it, temp);
        jsonValue["logDetail"].append(temp);
    }
    Module::JsonHelper::TypeToJsonValue(st.progress, jsonValue["progress"]);
    Module::JsonHelper::TypeToJsonValue(st.dataSize, jsonValue["dataSize"]);
    Module::JsonHelper::TypeToJsonValue(st.speed, jsonValue["speed"]);
    if (!st.extendInfo.empty()) {
        Module::JsonHelper::JsonStringToJsonValue(st.extendInfo, jsonValue["extendInfo"]);
    }
}
#endif  // JSON_TRANS_TUIL_H